static void __init machine_specific_arch_setup(void)
{
+ int ret;
struct xen_platform_parameters pp;
struct callback_register event = {
.type = CALLBACKTYPE_event,
memset(empty_zero_page, 0, sizeof(empty_zero_page));
}
- HYPERVISOR_callback_op(CALLBACKOP_register, &event);
- HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
+ ret = HYPERVISOR_callback_op(CALLBACKOP_register, &event);
+ if (ret == 0)
+ ret = HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
+ if (ret == -ENOSYS)
+ ret = HYPERVISOR_set_callbacks(
+ event.address.cs, event.address.eip,
+ failsafe.address.cs, failsafe.address.eip);
+ BUG_ON(ret);
cb.handler_address = (unsigned long)&nmi;
HYPERVISOR_nmi_op(XENNMI_register_callback, &cb);
static void __init machine_specific_arch_setup(void)
{
+ int ret;
struct callback_register event = {
.type = CALLBACKTYPE_event,
.address = (unsigned long) hypervisor_callback,
struct xennmi_callback cb;
#endif
- HYPERVISOR_callback_op(CALLBACKOP_register, &event);
- HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
- HYPERVISOR_callback_op(CALLBACKOP_register, &syscall);
+ ret = HYPERVISOR_callback_op(CALLBACKOP_register, &event);
+ if (ret == 0)
+ ret = HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
+ if (ret == 0)
+ ret = HYPERVISOR_callback_op(CALLBACKOP_register, &syscall);
+ if (ret == -ENOSYS)
+ ret = HYPERVISOR_set_callbacks(
+ event.address,
+ failsafe.address,
+ syscall.address);
+ BUG_ON(ret);
#ifdef CONFIG_X86_LOCAL_APIC
cb.handler_address = (unsigned long)&nmi;